package com.hr.String不可变性;

import org.junit.Test;

/**
 * @program: leetcode
 * @description: 字符串的常见操作
 * @author: HuRan QQ1345122890
 * @create: 2021-03-02 19:53
 */
public class StringTest5 {
    public static void main(String[] args) {

    }

    @Test
    public void test() {
        String s1 = "a" + "b" + "c"; //编译时优化 等同于abc
        String s2 = "abc"; //字符串常量池中的 将此地址返回 赋值给s2
        System.out.println(s1 == s2);
        System.out.println(s1.equalsIgnoreCase(s2));
    }

    @Test
    public void test2() {
        String s1 = "javaEE";
        String s2 = "hadoop";
        String s3 = "javaEEhadoop";
        String s4 = "javaEE" + "hadoop"; //编译器优化== javaEEhadoop
        String s5 = s1 + "hadoop";//拼接前后出现了变量 则需要在堆空间中new String() 内容为拼接后的结果
        String s6 = "javaEE" + s2;
        String s7 = s1 + s2;
        System.out.println(s3 == s4);//true
        System.out.println(s3 == s5);//false
        System.out.println(s3 == s6);//false
        System.out.println(s3 == s7);//false

        System.out.println(s5 == s6);//false

        System.out.println(s5 == s7);//false
        System.out.println(s6 == s7);//false
        //intern判断字符串常量池中是否存在javaEEhadoop，如果存在返回常量池中，地址不存在则放入一份 返回新创建的地址
        String s8 = s6.intern();

        System.out.println(s8 == s3);//true
    }

    @Test
    public void test3(){
        String a="a";
        String b="b";
        String s3="ab";
        /**
         * a+b执行细节 第一步 s = new StringBuilder()
         * s.append(a)
         * s.appent(b)
         * s4 = s.toString()
         * jdk5.0 之后使用StringBuilder  之前用的 StringBuffer
         */
        String s4=a+b;
        System.out.println(s3 == s4);//false

    }
    @Test
    public void test4(){
        final  String a="a"; //final 字符串拼接操作不一定使用的是StringBuilder如果字符串2边都是字符串常量或常量引用(final) 则是非StringBuilder方式（编译器优化 查看 .class文件可见 ） 能用上final就用上
        final  String b="b";
        String s3="ab";
        /**
         * a+b执行细节 第一步 s = new StringBuilder()
         * s.append(a)
         * s.appent(b)
         * s4 = s.toString()
         * jdk5.0 之后使用StringBuilder  之前用的 StringBuffer
         */
        String s4=a+b;
        System.out.println(s3 == s4);//true

    }

    @Test
    public void test5(){
        String s1="aaabbb";
        String s2="aaa";
        String s3=s2+"bbb";
        System.out.println(s1 == s3);//false

        final  String s4="aaa";
        String s5=s4+"bbb";
        System.out.println(s1 == s5);//true
    }
    //体会执行效率
    @Test
    public void test6(){
        long l = System.currentTimeMillis();
        method01();
        System.out.println(System.currentTimeMillis() - l);
    }
    public void method01(){
        //在实际开发中，如果基本确定容量，应该指定大小
        //自始至终只创建一个对象
        StringBuilder sb=new StringBuilder(100000);
        for (int i = 0; i < 100000; i++) {
            sb.append("a");
        }
    }
    public void method02(){
        String str="";
        for (int i = 0; i < 100000; i++) { //10万个StringBuilder 10万个new String()
            str+="a";
        }
    }
}